package com.example.roadeyeserver.aop;


import com.example.roadeyeserver.annotation.DS;
import com.example.roadeyeserver.datasource.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class DatasourceAop {

    // 定义切入点，即切入到自定义的注解类的路径
    @Pointcut("@annotation(com.example.roadeyeserver.annotation.DS)")
    public void datasourceAspect() {
    }

    // 切入点之前进行的操作
    @Before("datasourceAspect() && @annotation(ds)")
    public void beforeDatasource(JoinPoint point, DS ds) {
        // 获取注解中的值
        String value = ds.value();
        // 判断当前注解里的值是否存在
        if (DynamicDataSourceContextHolder.containsDataSource(value)) {
            // 如果存在，则使用注解中的数据
            DynamicDataSourceContextHolder.setDataSourceType(value);
//            log.info("当前数据源为:{}", DynamicDataSourceContextHolder.getDataSourceType());
        } else {
            // 不存在则使用默认数据源
            DynamicDataSourceContextHolder.setDataSourceType("db1");
        }
    }

    // 执行完方法之后，将threadLocal变量的数据源清空
    @After("@annotation(ds)")
    public void remoteDatasource(JoinPoint point, DS ds) {
        DynamicDataSourceContextHolder.clearDataSourceType();
    }
}

